/**
 * 简单的事件功能  $.evt()调用->全局, 绑定对象:
 * 		eg: obj.fn=$.evt 或 fn=$.evt.bind(obj)
 * @param m string 处理方式及事件名  前缀方式:
 * 		无:绑定,  #:绑定单次,  !:移除,  @:触发
 * @param v function|mixed 回调函数或触发参数
 * 		- 绑定|移除:回调函数,  触发:触发参数
 * 		触发执行: 回调函数.call(this, 触发参数)
 * @return array|this 触发:array 绑定|移除:this
 */
$.evt = function(m, v){
	let T=$.tmp(this,'__evt'), X=m[0];
	if(X==='@'){ // 触发
		let rtn=[], H=T[m.slice(1)]||[];
		for(let i=0; i<H.length; i++){
			rtn.push(H[i].B.call(this,v));
			if(H[i].X){ H.splice(i,1); i--; }
		}
		return rtn;
	}
	else if(X==='!') // 移除
		(X=T[m.slice(1)]) && $.ads(X,V=>V.B===v);
	else{ // 绑定
		X=X==='#'; v={B:v,X}; if(X) m=m.slice(1);
		if(T[m]) T[m].push(v); else T[m]=[v];
	}
	return this;
};
